home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
MACD 5
/
MACD 5.bin
/
workbench
/
dir
/
browser2.41
/
c
/
tiny_for.c
< prev
next >
Wrap
C/C++ Source or Header
|
1993-03-14
|
3KB
|
131 lines
/*
* For.c - Copyright © 1992 by Devil's child.
*
* Created: 30 Mar 1992 18:26:36
* Modified: 14 Mar 1993 12:03:47
*
* Make>> sc <file>.c
* Make>> slink LIB:cs.o <file>.o SC SD ND BATCH NOICONS TO <file> LIB LIB:Startup.lib LIB:String.lib
* Make>> Protect <file> P ADD
*/
extern struct ExecBase *SysBase;
char *Template = "Args/M,ALL/S,DONTFAIL/S,DO/K/A/F";
char *CliHelp = "\
For
V1.0 © 1992 by
S.R. & P.C.
\n\
Usage: For <Files | Pattern> [ALL] DO Command [args] [,Command [args] [,...]]\n\
For executes a list of commands for each file given,\n\
replacing each %% in commands with current file name.\n\
ALL: Recursively descends in subirectories.\n\
DONTFAIL: Continue even if a command fails.\n";
#define Arg_All 1
#define Arg_DontFail 2
#define Arg_Command 3
#define MAX_PATHLEN 256
BOOL CheckedRun(char *CmdBuf, long *RC)
{
if ((*RC = SystemTags(CmdBuf, TAG_DONE)) > Cli()->cli_FailLevel) {
Printf("ForEach: Command '%s' Failed.\n", CmdBuf);
return FALSE;
}
else
return TRUE;
}
/*
* Parse a line that may contain comas. Backslash ('\') is the override char.
*/
static void __inline ParseCmdLine(char *cmd)
{
char *s,*d,c;
s = d = cmd;
while (c = *d++ = *s++) {
if (c == '\\')
*(d-1) = *s++;
else if (c == ',')
*(d-1) = '\n';
}
}
long Main(char *argv[], struct WBStartup *WBenchMsg)
{
char CmdBuf[512], Fmt[512], ArgBuf[256];
char **Args, *s;
struct AnchorPath *AP;
long RC = 20, len;
BOOL Found = FALSE, Abort = FALSE;
strcpy(Fmt, argv[Arg_Command]);
if ((len = strlen(Fmt)) == 0)
return 10;
ParseCmdLine(Fmt); /* Replace , by \n to separate commands */
s = Fmt;
while(*s) {
if (*s == '%' && *(s+1) == '%') {
*(s+1) = 's';
Found = TRUE;
}
s++;
}
if (!Found)
strcpy(&Fmt[len], " %s");
if (Args = (char **)argv[0]) {
if (AP = AllocVec(sizeof(struct AnchorPath)+MAX_PATHLEN, MEMF_PUBLIC|MEMF_CLEAR)) {
while (!Abort && *Args) {
LONG MatchErr;
AP->ap_BreakBits = SIGBREAKF_CTRL_C; /* Break on these bits */
AP->ap_Strlen = MAX_PATHLEN;
AP->ap_Flags = (argv[Arg_All]) ? APF_DODOT : APF_DODOT|APF_DOWILD; /* allow convertion of '.' to CurrentDir */
MatchErr = MatchFirst(*Args, AP);
while (!MatchErr) {
if (argv[Arg_All] && AP->ap_Info.fib_DirEntryType > 0) {
if (!(AP->ap_Flags & APF_DIDDIR))
AP->ap_Flags |= APF_DODIR;
/* clear the completed directory flag */
AP->ap_Flags &= ~APF_DIDDIR;
}
else {
s = AP->ap_Buf;
SPrintf(ArgBuf, StrChr(s, ' ') ? "\"%s\"" : "%s", s);
/* Allow 5 %% in cmd */
SPrintf(CmdBuf, Fmt, ArgBuf, ArgBuf, ArgBuf, ArgBuf, ArgBuf);
if (!CheckedRun(CmdBuf, &RC) && !argv[Arg_DontFail]) {
Abort = TRUE;
break;
}
}
MatchErr = MatchNext(AP);
}
MatchEnd(AP); /* This absolutely, positively must be called, all of the time. */
if (!Abort && MatchErr != ERROR_NO_MORE_ENTRIES) {
PrintFault(MatchErr, NULL);
RC = 20;
break;
}
Args++;
}
FreeVec(AP);
}
}
else {
SPrintf(CmdBuf, Fmt, "", "", "", "", ""); /* Always remove %%'s from command line */
CheckedRun(CmdBuf, &RC);
}
return RC;
}